home *** CD-ROM | disk | FTP | other *** search
- ; (c) D.R.McAuley 1987
- r0 RN 0
- r1 RN 1
- r2 RN 2
- r3 RN 3
- r4 RN 4
- r5 RN 5
- r6 RN 6
- r7 RN 7
- r8 RN 8
- r9 RN 9
- r10 RN 10
- r11 RN 11
- r12 RN 12
- r13 RN 13
- r14 RN 14
- pc RN 15
-
- ON * 1
- OFF * 0
- OutputToo * OFF ; ON means buffer output also OFF means ...
-
-
- C_bit * &20000000
- V_bit * &10000000
-
-
- ; Useful SWI numbers
- OS_IntOn * 19
- OS_IntOff * 20
- OS_Claim * 31
- OS_Release * 32
-
- ; Useful Vector numbers
- ErrorV * &01
- IrqV * &02
- WrchV * &03
- Rdch * &04
- CliV * &05
- ByteV * &06
- WordV * &07
- FileV * &08
- ArgsV * &09
- BGetV * &0A
- BputV * &0B
- GBPBV * &0C
- OpenV * &0D
- ReadlineV * &0E
- FSCV * &0F
- EventV * &10
- INSV * &14
- REMV * &15
- CNPV * &16
- UKVDU23V * &17
- UKSWIV * &18
- UKPLOTV * &19
- MouveV * &1A
- VDUXV * &1B
- TickerV * &1C
- UpcallV * &1D
-
- ; Buffer numbers
-
- Keyboard * 0
- RS423_In * 1
- RS243_Out * 2
-
-
-
- IMPORT |_rsinsertinn|
- IMPORT |_rsremoveinn|
- IMPORT |_rscountnpinn|
- IMPORT |_rsinsertout|
- IMPORT |_rsremoveout|
- IMPORT |_rscountnpout|
- IMPORT |_kbinsertinn|
- IMPORT |_kbremoveinn|
- IMPORT |_kbcountnpinn|
-
- AREA |C$$code|, CODE, READONLY
-
-
- |v$codeseg|
-
-
- ; intercept the appropriate system vectors
- ; r2 is a dummy work space pointer
- rsintercept
- SWI OS_IntOff ; Disable Interrupts
-
- MOV r2, #0
-
- MOV r0, #INSV
- ADR r1, vecinsert
- SWI OS_Claim ; Claim vector
-
- MOV r0, #REMV
- ADR r1, vecremove
- SWI OS_Claim ; Claim vector
-
- MOV r0, #CNPV
- ADR r1, veccountnp
- SWI OS_Claim ; Claim vector
-
- SWI OS_IntOn ; Enable Interrupts
- MOV pc, r14
-
- ; release the claims we have on system interrupts
- ; r2 is a dummy work space pointer
- rsrelease
- SWI OS_IntOff ; Disable Interrupts
-
- MOV r2,#0
-
- MOV r0, #INSV
- ADR r1, vecinsert
- SWI OS_Release ; Release vector
-
- MOV r0, #REMV
- ADR r1, vecremove
- SWI OS_Release ; Release vector
-
- MOV r0, #CNPV
- ADR r1, veccountnp
- SWI OS_Release ; Release vector
-
- SWI OS_IntOn ; Enable Interrupts
- MOV pc, r14
-
-
-
-
- ; intercept the appropriate system vectors
- ; r2 is a dummy work space pointer
- kbintercept
- SWI OS_IntOff ; Disable Interrupts
-
- MOV r2, #0
-
- MOV r0, #INSV
- ADR r1, kbvecinsert
- SWI OS_Claim ; Claim vector
-
- MOV r0, #REMV
- ADR r1, kbvecremove
- SWI OS_Claim ; Claim vector
-
- MOV r0, #CNPV
- ADR r1, kbveccountnp
- SWI OS_Claim ; Claim vector
-
- SWI OS_IntOn ; Enable Interrupts
- MOV pc, r14
-
- ; release the claims we have on system interrupts
- ; r2 is a dummy work space pointer
- kbrelease
- SWI OS_IntOff ; Disable Interrupts
-
- MOV r2,#0
-
- MOV r0, #INSV
- ADR r1, kbvecinsert
- SWI OS_Release ; Release vector
-
- MOV r0, #REMV
- ADR r1, kbvecremove
- SWI OS_Release ; Release vector
-
- MOV r0, #CNPV
- ADR r1, kbveccountnp
- SWI OS_Release ; Release vector
-
- SWI OS_IntOn ; Enable Interrupts
- MOV pc, r14
-
-
- ; insert a charater into a buffer either a character from the receiver
- ; or a character to be transmitted
- vecinsert
- CMP r1, #RS423_In
- [ OutputToo = ON
- CMPNE r1, #RS423_Out
- ]
- MOVNE pc, r14
- STMFD r13!,{r0-r12}
- [ OutputToo = ON
- CMP r1, #RS423_In
- BLEQ |_rsinsertinn|
- BLNE |_rsinsertout|
- |
- BL |_rsinsertinn|
- ]
- CMP r0, #1
- LDMFD r13!, {r0-r12,r14}
- BIC r14, r14, #C_bit
- ORREQ r14, r14, #C_bit
- MOVS pc, r14
-
-
- ; remove a character from a buffer, either fetch a receoved character
- ; or transmit the next character
- vecremove
- CMP r1, #RS423_In
- [ OutputToo = ON
- CMPNE r1, #RS423_Out
- ]
- MOVNE pc, r14
- STMFD r13!,{r1,r3-r12}
- AND r0, r14, #V_bit
- [ OutputToo = ON
- CMP r1, #RS423_In
- BLEQ |_rsremoveinn|
- BLNE |_rsremoveout|
- |
- BL |_rsremoveinn|
- ]
- LDMFD r13!, {r1,r3-r12,r14}
- BIC r14, r14, #C_bit
- CMP r0, #256
- ORRGE r14, r14, #C_bit
- MOV r2, r0
- MOVS pc, r14
-
- ; either examine the buffers or purge there contents
- veccountnp
- BVS veccountp
- CMP r1, #RS423_In
- [ OutputToo = ON
- CMPNE r1, #RS423_Out
- ]
- MOVNE pc, r14
- [ OutputToo = ON
- CMP r1, #RS423_In
- ]
- STMFD r13!,{r3-r12}
- AND r0, r14, #V_bit
- AND r1, r14, #C_bit
- [ OutputToo = ON
- BLEQ |_rscountnpinn|
- BLNE |_rscountnpout|
- |
- BL |_rscountnpinn|
- ]
- LDMFD r13!, {r3-r12,pc}
-
- veccountp
- CMP r1, #RS423_In
- [ OutputToo = ON
- CMPNE r1, #RS423_Out
- ]
- MOVNE pc, r14
- [ OutputToo = ON
- CMP r1, #RS423_In
- ]
- STMFD r13!,{r1-r12}
- AND r0, r14, #V_bit
- AND r1, r14, #C_bit
- [ OutputToo = ON
- BLEQ |_rscountnpinn|
- BLNE |_rscountnpout|
- |
- BL |_rscountnpinn|
- ]
- LDMFD r13!, {r1-r12,pc}
-
-
-
- kbvecinsert
- CMP r1, #Keyboard
- MOVNE pc, r14
- STMFD r13!, {r0-r12}
- BL |_kbinsertinn|
- CMP r0, #1
- LDMFD r13!, {r0-r12,r14}
- BIC r14, r14, #C_bit
- ORREQ r14, r14, #C_bit
- MOVS pc, r14
-
- kbvecremove
- CMP r1, #Keyboard
- MOVNE pc, r14
- STMFD r13!,{r1,r3-r12}
- AND r0, r14, #V_bit
- BL |_kbremoveinn|
- LDMFD r13!, {r1,r3-r12,r14}
- BIC r14, r14, #C_bit
- CMP r0, #256
- ORRGE r14, r14, #C_bit
- MOV r2, r0
- MOVS pc, r14
-
- kbveccountnp
- BVS kbveccountp
- CMP r1, #Keyboard
- MOVNE pc, r14
- STMFD r13!,{r3-r12}
- AND r0, r14, #V_bit
- AND r1, r14, #C_bit
- BL |_kbcountnpinn|
- LDMFD r13!, {r3-r12,pc}
-
- kbveccountp
- CMP r1, #Keyboard
- MOVNE pc, r14
- STMFD r13!,{r1-r12}
- AND r0, r14, #V_bit
- AND r1, r14, #C_bit
- BL |_kbcountnpinn|
- LDMFD r13!, {r1-r12,pc}
-
-
-
- ; Need at least 64 bytes of Data to stop objasm hanging!!!!
- AREA |C$$data|
- |v$dataseg|
- DCD &0
- ALIGN 64
-
-
- EXPORT |rsintercept|
- EXPORT |rsrelease|
-
- EXPORT |kbintercept|
- EXPORT |kbrelease|
-
- END
-